import Bus from 'vue'
import wxShare from 'weixin-js-sdk'
import { getJsApiParams } from '../api'
import * as $utils from '../utils/index.js'
// import { SetLocalStorage, GetLocalStorage } from '../utils/mixin'

export default {
  install (Vue) {
    // 注册Bus 子穿子
    Vue.prototype.Bus = new Bus()
    // 注册Bus 子穿子
    Vue.prototype.$utils = $utils
    // 路由跳转
    Vue.prototype.jumpTo = function (path) {
      this.$router.push(path)
    }
    // 无历史记录跳转
    Vue.prototype.noPastTo = function (path) {
      this.$router.replace(path)
    }
    // 路由返回
    Vue.prototype.goBack = function (path) {
      if (path < -1) return this.$router.go(path)
      window.history.length > 1 ? this.$router.go(-1) : this.$router.push('/')
    }
    // 获取当前链接上的参数
    Vue.prototype.getCurrentQuery = function (key) {
      let arr = window.location.href.split('?')[1]
      let arr1 = []
      let arr2 = {}
      if (arr) {
        arr1 = arr.split('&')
        for (let i = 0; i < arr1.length; i++) {
          let arr3 = arr1[i].split('=')
          arr2[arr3[0]] = arr3[1]
        }
      }
      return arr2[key]
    }
    // 提示框
    let $toastText = function (val) {
      Vue.$vux.toast.show({
        text: val,
        time: 2000,
        type: 'text',
        position: 'middle',
        width: 'auto',
        isShowMask: true
      })
    }
    Vue.prototype.$toastText = $toastText

    // 支付宝api支付
    Vue.prototype.$AliPay = function (data) {
      let result = data.result
      let formresult = data.formresult
      // 非App环境下调用支付宝网页支付
      if (!this.$APIIsExist) {
        const form = formresult
        const div = document.getElementById('alipay') || document.createElement('div')
        div.id = 'alipay'
        div.innerHTML = form
        document.body.appendChild(div)
        document.querySelector('#alipay').children[0].submit() // 执行后会唤起支付宝
        return
      }
      // App环境下调用api官方支付宝支付
      return new Promise((resolve, reject) => {
        let aliPay = api.require('aliPay')
        aliPay.payOrder({
          orderInfo: result
        }, (ret) => {
          switch (+ret.code) {
            case 4000:
              $toastText('系统异常')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 4001:
              $toastText('数据格式不正确')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 4003:
              $toastText('该用户绑定的支付宝账户被冻结或不允许支付')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 4004:
              $toastText('该用户已解除绑定')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 4005:
              $toastText('绑定失败或没有绑定')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 4006:
              $toastText('订单支付失败')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 4010:
              $toastText('重新绑定账户')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 6000:
              $toastText('支付服务正在进行升级操作')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 6001:
              $toastText('用户中途取消支付操作')
              // eslint-disable-next-line prefer-promise-reject-errors
              reject()
              break
            case 9000:
              $toastText('支付成功')
              resolve()
              break
          }
        })
      })
    }
    // wx全局分享方法
    Vue.prototype.$weChatShare = function (weChatParams) {
      if (typeof weChatParams.name !== 'string') {
        console.error('weChatParams.name is not a string')
      }
      if (typeof weChatParams.params !== 'object') {
        console.error('weChatParams.prarms is not a object')
        return
      }

      if (!window.api) {
        if (weChatParams.name === 'chat') {
          this.$wxSdkShareChat(weChatParams.params)
        } else if (weChatParams.name === 'space') {
          this.$wxSdkShareSpace(weChatParams.params)
        }
        return
      }

      var wx = api.require('wx')

      // 检测当前设备有没有安装微信客户端
      wx.isInstalled((ret, err) => {
        if (ret.installed) {
          if (weChatParams.name === 'text') {
            this.$wxShareText(weChatParams.params)
          } else if (weChatParams.name === 'webpage') {
            this.$wxShareWebpage(weChatParams.params)
          } else if (weChatParams.name === 'image') {
            this.$wxShareImage(weChatParams.params)
          }
        } else {
          switch (err.code) {
            case -1:
              this.$toastText('获取失败，未知错误。' + JSON.stringify(err))
              break
            case 0:
              this.$toastText('当前设备未安装微信客户端')
              break
          }
        }
      })
    }
    // 分享图片到朋友圈，会话窗口，收藏
    Vue.prototype.$wxShareImage = function (image) {
      if (typeof image.thumb !== 'string') {
        console.error('image.thumb is not a string')
        return
      }
      if (typeof image.contentUrl !== 'string') {
        console.error('image.contentUrl is not a string')
        return
      }
      var wx = api.require('wx')
      wx.shareImage({
        apiKey: image.apiKey, // （可选）从微信开放平台获取的 appid
        scene: image.scene, // （可选）场景值 session（会话）timeline（朋友圈）favorite（收藏）
        thumb: image.thumb, // （必选）要分享的网页缩略图，大小不能超过32k，支持 fs://、widget:// 协议
        contentUrl: image.contentUrl // （必选）分享图片的 url 地址，长度不能超过10M，支持 fs://、widget:// 协议
      }, (ret, err) => {
        if (ret.status) {
          this.$toastText('图片分享成功')
        } else {
          weChatCodeScreen(err)
        }
      })
    }
    // 分享网页到朋友圈，会话窗口，收藏
    Vue.prototype.$wxShareWebpage = function (webpage) {
      if (typeof webpage.contentUrl !== 'string') {
        console.error('webpage.contentUrl is not a string')
        return
      }
      var wx = api.require('wx')
      wx.shareWebpage({
        apiKey: webpage.apiKey, // （可选）从微信开放平台获取的 appid
        scene: webpage.scene, // （可选）场景值 session（会话）timeline（朋友圈）favorite（收藏）
        title: webpage.title, // （可选）要分享的网页标题
        description: webpage.description, // （可选）要分享的网页描述
        thumb: webpage.thumb, // （可选）要分享的网页缩略图，大小不能超过32k，要求 fs://、widget:// 协议
        contentUrl: webpage.contentUrl // （必选）分享网页的 url 地址，长度不能超过10K
      }, (ret, err) => {
        if (ret.status) {
          this.$toastText('链接分享成功')
        } else {
          weChatCodeScreen(err)
        }
      })
    }
    // 分享文字到朋友圈
    Vue.prototype.$wxShareText = function (text) {
      if (typeof text.text !== 'string') {
        console.error('text.text is not a string')
        return
      }
      var wx = api.require('wx')
      // 分享文本到朋友圈
      wx.shareText({
        apiKey: text.apiKey, // （可选）从微信开放平台获取的 appid
        scene: text.scene, // （可选）场景值 timeline（朋友圈）
        text: text.text // （必选）要分享的文字内容
      }, (ret, err) => {
        if (ret.status) {
          this.$toastText('文字分享成功')
        } else {
          weChatCodeScreen(err)
        }
      })
    }
    // 微信错误信息处理
    let weChatCodeScreen = (err) => {
      switch (err.code) {
        case -1:
          $toastText('获取失败，未知错误。' + JSON.stringify(err))
          break
        case 0:
          $toastText('分享成功')
          break
        case 1:
          $toastText('apikey非法')
          break
        case 2:
          $toastText('用户取消')
          break
        case 3:
          $toastText('发送失败')
          break
        case 4:
          $toastText('授权拒绝')
          break
        case 5:
          $toastText('微信服务器返回的不支持错误')
          break
        case 7:
          $toastText('注册SDK失败')
          break
      }
    }
    // 微信SDK分享配置
    let host = 'http://' + location.host
    let url = (host.indexOf('192.168') !== -1 || host.indexOf('location') !== -1) ? 'http://web.zanjl.com' : host
    getJsApiParams(url).then(res => {
      if (res && res.code === 200) {
        let param = JSON.parse(res.data)
        wxShare.config({
          debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
          appId: param.appId, // 必填，公众号的唯一标识
          nonceStr: param.nonceStr, // 必填，生成签名的时间戳
          timestamp: param.timeStamp, // 必填，生成签名的随机串
          signature: param.signature, // 必填，签名
          jsApiList: [
            'updateAppMessageShareData', // updateAppMessageShareData 分享链接到微信回话或QQ聊天 chat
            'updateTimelineShareData', // updateTimelineShareData 分享链接到微信朋友圈或QQ空间 space
            'onMenuShareAppMessage', // onMenuShareAppMessage 老分享链接到微信回话
            'onMenuShareTimeline', // onMenuShareTimeline 老分享链接到微信朋友圈
            'chooseWXPay' // chooseWXPay 微信支付
          ] // 必填，需要使用的JS接口列表
        })
      }
    }).catch((err) => {
      console.error(err)
    })
    // 微信SDK分享到回话窗口
    Vue.prototype.$wxSdkShareChat = function (params) {
      if (typeof params.desc !== 'string') {
        console.error('params.desc is not string')
        return
      }
      if (!checkParamsType(params)) {
        return
      }
      return new Promise((resolve, reject) => {
        wxShare.ready(() => {
          // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
          wxShare.updateAppMessageShareData({
            title: params.title, // 分享标题
            desc: params.desc, // 分享描述
            link: params.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: params.imgUrl, // 分享图标
            success: (res) => {
              resolve(res)
              $toastText('链接分享成功')
            }
          })
        })
        wxShare.error((err) => {
          // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
          reject(err)
          $toastText('链接分享失败')
        })
      })
    }
    // 微信SDK分享到朋友圈
    Vue.prototype.$wxSdkShareSpace = function (params) {
      if (!checkParamsType(params)) {
        return
      }
      return new Promise((resolve, reject) => {
        wxShare.ready(() => {
          // config信息验证后会执行ready方法，所有接口调用都必须在config接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在ready函数中。
          wxShare.updateTimelineShareData({
            title: params.title, // 分享标题
            link: params.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: params.imgUrl, // 分享图标
            success: (res) => {
              resolve(res)
              $toastText('链接分享成功')
            }
          })
        })
        wxShare.error((err) => {
          // config信息验证失败会执行error函数，如签名过期导致验证失败，具体错误信息可以打开config的debug模式查看，也可以在返回的res参数中查看，对于SPA可以在这里更新签名。
          reject(err)
          $toastText('链接分享失败')
        })
      })
    }
    // 老微信SDK分享到回话窗口
    Vue.prototype.$wxSdkShareOldChat = function (params) {
      if (typeof params.desc !== 'string') {
        console.error('params.desc is not string')
        return
      }
      if (!checkParamsType(params)) {
        return
      }
      return new Promise((resolve, reject) => {
        wxShare.ready(() => {
          wxShare.onMenuShareAppMessage({
            title: params.title, // 分享标题
            desc: params.desc, // 分享描述
            link: params.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: params.imgUrl, // 分享图标
            type: 'link', // 分享类型,music、video或link，不填默认为link
            dataUrl: '', // 如果type是music或video，则要提供数据链接，默认为空
            success: (res) => {
              resolve(res)
            }
          })
        })
        wxShare.error((err) => {
          reject(err)
        })
      })
    }
    // 老微信SDK分享到朋友圈
    Vue.prototype.$wxSdkShareOldSpace = function (params) {
      if (!checkParamsType(params)) {
        return
      }
      return new Promise((resolve, reject) => {
        wxShare.ready(() => {
          wxShare.onMenuShareTimeline({
            title: params.title, // 分享标题
            link: params.link, // 分享链接，该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: params.imgUrl, // 分享图标
            success: (res) => {
              resolve(res)
            }
          })
        })
        wxShare.error((err) => {
          reject(err)
        })
      })
    }
    // 微信支付
    Vue.prototype.$wxSdkWeChatPay = function (params) {
      return new Promise((resolve, reject) => {
        wxShare.chooseWXPay({
          timestamp: params.timestamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
          nonceStr: params.nonceStr, // 支付签名随机串，不长于 32 位
          package: params.package, // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=\*\*\*）
          signType: params.signType, // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
          paySign: params.paySign, // 支付签名
          success: (res) => {
            resolve(res)
          },
          fail: (err) => {
            reject(err)
          }
        })
        wxShare.error((err) => {
          reject(err)
        })
      })
    }
    // 检测参数类型
    let checkParamsType = function (params) {
      if (typeof params !== 'object') {
        console.error('params is not object')
        return false
      }
      if (typeof params.title !== 'string') {
        console.error('params.title is not string')
        return false
      }
      if (typeof params.link !== 'string') {
        console.error('params.link is not string')
        return false
      }
      if (typeof params.imgUrl !== 'string') {
        console.error('params.imgUrl is not string')
        return false
      }
      if (params.link.indexOf('http://') === -1 && params.link.indexOf('https://') === -1) {
        console.error('params.link is not link')
        return false
      }
      if (params.imgUrl.indexOf('http://') === -1 && params.imgUrl.indexOf('https://') === -1) {
        console.error('params.imgUrl is not link')
        return false
      }
      return true
    }
    // 两数相乘
    Vue.prototype.accMul = function (num1, num2) {
      // eslint-disable-next-line one-var
      var m = 0, s1 = num1.toString(), s2 = num2.toString()
      try { m += s1.split('.')[1].length } catch (e) { }
      try { m += s2.split('.')[1].length } catch (e) { }
      return Number(s1.replace('.', '')) * Number(s2.replace('', '')) / Math.pow(10, m)
    }
  }
}
